import pandas as pd


def get_course_package_resource_ids(excel_file_path, sheet_name=None):
    """
    从Excel文件中筛选【资源类型】为【课程包】的数据，获取【资源id】的去重列表

    Parameters:
    excel_file_path: Excel文件路径
    sheet_name: 工作表名称，如果为None则读取第一个工作表

    Returns:
    list: 去重后的资源ID列表
    """
    try:
        # 读取Excel文件
        if sheet_name:
            df = pd.read_excel(excel_file_path, sheet_name=sheet_name)
        else:
            df = pd.read_excel(excel_file_path)

        print(f"Excel文件读取成功，共{len(df)}行数据")
        print(f"列名: {list(df.columns)}")

        # 检查必要的列是否存在
        required_columns = ['资源类型', '资源ID']
        missing_columns = [col for col in required_columns if col not in df.columns]

        if missing_columns:
            print(f"错误：Excel文件中缺少以下列: {missing_columns}")
            return []

        # 筛选【资源类型】为【课程包】的数据
        filtered_df = df[df['资源类型'] == '课程讲']
        print(f"筛选出【课程包】类型的数据: {len(filtered_df)}行")

        if filtered_df.empty:
            print("警告：没有找到资源类型为【课程包】的数据")
            return []

        # 获取【资源id】列并去重
        resource_ids = filtered_df['资源ID'].dropna().unique().tolist()

        # 转换为整数（如果需要）
        try:
            resource_ids = [int(id_val) for id_val in resource_ids if pd.notna(id_val)]
        except (ValueError, TypeError):
            # 如果无法转换为整数，保持原始类型
            resource_ids = [str(id_val) for id_val in resource_ids if pd.notna(id_val)]

        print(f"去重后的资源ID数量: {len(resource_ids)}")

        return resource_ids

    except FileNotFoundError:
        print(f"错误：找不到文件 {excel_file_path}")
        return []
    except Exception as e:
        print(f"错误：处理Excel文件时出现异常: {str(e)}")
        return []


def analyze_resource_types(excel_file_path, sheet_name=None):
    """
    分析Excel中所有的资源类型，帮助确认筛选条件
    """
    try:
        if sheet_name:
            df = pd.read_excel(excel_file_path, sheet_name=sheet_name)
        else:
            df = pd.read_excel(excel_file_path)

        if '资源类型' in df.columns:
            resource_types = df['资源类型'].value_counts()
            print("资源类型统计：")
            for resource_type, count in resource_types.items():
                print(f"  {resource_type}: {count}条")
        else:
            print("未找到【资源类型】列")

    except Exception as e:
        print(f"分析资源类型时出错: {str(e)}")


def save_ids_to_file(resource_ids, output_file='resource_ids.txt'):
    """
    将资源ID列表保存到文件
    """
    try:
        with open(output_file, 'w', encoding='utf-8') as f:
            for id_val in resource_ids:
                f.write(str(id_val) + ',')
        print(f"资源ID已保存到文件: {output_file}")
    except Exception as e:
        print(f"保存文件时出错: {str(e)}")


# 使用示例
if __name__ == "__main__":
    # 设置Excel文件路径
    excel_file = "D:\\project_file\\周末智学导出资源\\2025-2026第一学期周末智学物理学科课表盘点（物理）.xlsx"  # 请替换为你的Excel文件路径

    print("=" * 50)
    print("开始解析Excel文件...")

    # 先分析资源类型分布（可选，帮助了解数据）
    print("\n1. 分析资源类型分布：")
    analyze_resource_types(excel_file)

    # 获取课程包的资源ID列表
    print("\n2. 获取【课程包】类型的资源ID：")
    course_package_ids = get_course_package_resource_ids(excel_file, "高二上")

    if course_package_ids:
        print(f"\n3. 结果展示：")
        print(f"找到 {len(course_package_ids)} 个唯一的课程包资源ID")
        print("资源ID列表：")
        print(course_package_ids)

        # 保存到文件
        save_ids_to_file(course_package_ids, "2025-2026第一学期周末智学物理学科课表盘点（物理）高二上.txt")

        # 如果ID很多，只显示前10个
        if len(course_package_ids) > 10:
            print(f"\n前10个ID: {course_package_ids[:10]}")
    else:
        print("未找到符合条件的数据")

    print("=" * 50)


# 如果你需要处理特定工作表，可以这样调用：
# course_package_ids = get_course_package_resource_ids("file.xlsx", sheet_name="数据表")

# 如果你需要将结果用于其他用途，比如生成SQL的IN子句：
def generate_sql_in_clause(resource_ids):
    """
    将资源ID列表转换为SQL的IN子句格式
    """
    if not resource_ids:
        return "IN ()"

    id_str = ",".join(str(id_val) for id_val in resource_ids)
    return f"IN ({id_str})"

# 使用示例：
# ids = get_course_package_resource_ids("file.xlsx")
# sql_clause = generate_sql_in_clause(ids)
# print(f"SQL IN子句: {sql_clause}")